#ifndef xpack_math_point
#define xpack_math_point
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::math_point::inc
#include"define/base_type.hpp"
#include"macro/xexport.hpp"
#include"macro/xstruct.hpp"
#pragma pop_macro("xuser")

namespace mixc::math_point{
    #define xarg_name       point
    #define xarg_a0         x
    #define xarg_a1         y
    #define xarg_a2         z
    #include"math/private/xgen.geometry.hpp"
}

namespace mixc::math_point::origin{
    template<class x_t, class y_t = x_t, class z_t = void>
    using point = mixc::math_point::point<x_t, y_t, z_t>;

    //                  x    y
    using pt2b  = point<u08, u08>;
    using pt2w  = point<u16, u16>;
    using pt2d  = point<u32, u32>;
    using pt2q  = point<u64, u64>;
    using pt2u  = point<uxx, uxx>;
    using pt2bx = point<i08, i08>;
    using pt2wx = point<i16, i16>;
    using pt2dx = point<i32, i32>;
    using pt2qx = point<i64, i64>;
    using pt2x  = point<ixx, ixx>;
    using pt2s  = point<f32, f32>;
    using pt2f  = point<f64, f64>;

    //                  x    y    z
    using pt3b  = point<u08, u08, u08>;
    using pt3w  = point<u16, u16, u16>;
    using pt3d  = point<u32, u32, u32>;
    using pt3q  = point<u64, u64, u64>;
    using pt3u  = point<uxx, uxx, uxx>;
    using pt3bx = point<i08, i08, i08>;
    using pt3wx = point<i16, i16, i16>;
    using pt3dx = point<i32, i32, i32>;
    using pt3qx = point<i64, i64, i64>;
    using pt3x  = point<ixx, ixx, ixx>;
    using pt3s  = point<f32, f32, f32>;
    using pt3f  = point<f64, f64, f64>;
}

#endif

xexport_space(mixc::math_point::origin)
